// Copyright Epic Games, Inc. All Rights Reserved.

#include "GameFeatureAction_SplitscreenConfig.h"

#include "Engine/GameInstance.h"
#include "Engine/GameViewportClient.h"
#include "GameFeatures/GameFeatureAction_WorldActionBase.h"

#include UE_INLINE_GENERATED_CPP_BY_NAME(GameFeatureAction_SplitscreenConfig) // 包含自动生成的代码

#define LOCTEXT_NAMESPACE "LyraGameFeatures" // 定义本地化文本命名空间

//////////////////////////////////////////////////////////////////////
// UGameFeatureAction_SplitscreenConfig

TMap<FObjectKey, int32> UGameFeatureAction_SplitscreenConfig::GlobalDisableVotes; // 定义静态成员

/**
 * 游戏特性停用时调用
 */
void UGameFeatureAction_SplitscreenConfig::OnGameFeatureDeactivating(FGameFeatureDeactivatingContext& Context)
{
	Super::OnGameFeatureDeactivating(Context); // 调用父类方法

	for (int32 i = LocalDisableVotes.Num() - 1; i >= 0; i-- ) // 从后向前遍历本地禁用投票
	{
		FObjectKey ViewportKey = LocalDisableVotes[i]; // 获取视口键
		UGameViewportClient* GVP = Cast<UGameViewportClient>(ViewportKey.ResolveObjectPtr()); // 解析视口客户端
		const FWorldContext* WorldContext = GEngine->GetWorldContextFromGameViewport(GVP); // 从游戏视口获取世界上下文
		if (GVP && WorldContext) // 检查视口客户端和世界上下文有效
		{
			if (!Context.ShouldApplyToWorldContext(*WorldContext)) // 检查是否应应用到世界上下文
			{
				// 错误的上下文，忽略它，死亡对象计为此上下文的一部分
				continue; // 继续下一个
			}
		}

		int32& VoteCount = GlobalDisableVotes[ViewportKey]; // 获取投票计数
		if (VoteCount <= 1) // 检查投票计数是否小于等于1
		{
			GlobalDisableVotes.Remove(ViewportKey); // 移除视口键

			if (GVP && WorldContext) // 检查视口客户端和世界上下文有效
			{
				GVP->SetForceDisableSplitscreen(false); // 设置强制禁用分屏为false
			}
		}
		else
		{
			--VoteCount; // 递减投票计数
		}
		LocalDisableVotes.RemoveAt(i); // 移除本地投票
	}
}

/**
 * 添加到世界的方法
 */
void UGameFeatureAction_SplitscreenConfig::AddToWorld(const FWorldContext& WorldContext, const FGameFeatureStateChangeContext& ChangeContext)
{
	if (bDisableSplitscreen) // 检查是否禁用分屏
	{
		if (UGameInstance* GameInstance = WorldContext.OwningGameInstance) // 获取游戏实例
		{
			if (UGameViewportClient* VC = GameInstance->GetGameViewportClient()) // 获取游戏视口客户端
			{
				FObjectKey ViewportKey(VC); // 创建视口键

				LocalDisableVotes.Add(ViewportKey); // 添加本地投票

				int32& VoteCount = GlobalDisableVotes.FindOrAdd(ViewportKey); // 查找或添加全局投票计数
				VoteCount++; // 递增投票计数
				if (VoteCount == 1) // 检查是否是第一次投票
				{
					VC->SetForceDisableSplitscreen(true); // 设置强制禁用分屏为true
				}
			}
		}
	}
}

#undef LOCTEXT_NAMESPACE // 取消定义本地化文本命名空间